// https://leetcode.cn/problems/count-and-say/

// 题干：给定一个正整数 n ，输出外观数列的第 n 项。
//      「外观数列」是一个整数序列，从数字 1 开始，序列中的每一项都是对前一项的描述。
//      你可以将其视作是由递归公式定义的数字字符串序列：
//      countAndSay(1) = "1"
//      countAndSay(n) 是对 countAndSay(n-1) 的描述，然后转换成另一个数字字符串。

// 示例：输入：n = 4
//      输出："1211"

// 碎语：所谓外观数列，意即模拟题目的意思敲除代码，我们发现除了第一个数字1外
//       后续都是由描述前一个而来，设置两个指针，用作记下数量和所记录数字
//       不需要被吓到，仔细分析就行

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    string countAndSay(int n)
    {
        string res = "1";

        for (int i = 0 ; i < n - 1 ; i++){
            string tmp;
            int left = 0, right = 0;

            while (right < res.size()){
                while (right < res.size() && res[right] == res[left]) right++;
                tmp += to_string(right - left);
                tmp += res[left];
                left = right;
            }
            res = tmp;
        }

        return res;
    }
};

int main()
{
    Solution sol;

    string index = sol.countAndSay(4);
    cout << index << endl;

    return 0;
}